﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using Terrae.Datos.IDaos;
using Terrae.Clases;
using Terrae.Clases.FabricaClase;

namespace Terrae.Datos.DaoSqlServer
{
    public class DaoInvernadero : DaoSqlServer , IDaoInvernadero
    {
        #region Atributos

        private Conexion bd = new Conexion();
        private int promedioV;
        SqlCommand command = new SqlCommand();
        private Entidad _miInvernadero = null;
        private List<Entidad> _lInvernadero = null;
        //private Entidad _lVariables = null;
        private Entidad _invernadero = FabricaEntidad.NuevoInvernadero();
        private Entidad _inv = FabricaEntidad.NuevoInvernadero();
        private string _nombre;

        #endregion Atributos

        #region Métodos

        #region Agregar Invernadero

        /// <summary>
        /// Método que accede a la base de datos para
        /// agregar un invernadero.
        /// </summary>
        /// <param name="_invernadero"></param>
        /// <returns></returns>
        public bool AgregarInvernadero(Entidad _invernadero)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSInvernadero]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Nombre",
                (_invernadero as Invernadero).Nombre);
                command.Parameters.AddWithValue("@Descripcion",
                (_invernadero as Invernadero).Descripcion);
                command.Parameters.AddWithValue("@Persona",
                (_invernadero as Invernadero).Persona);

                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                bd.CerrarConexion();
            }
        }

        #endregion Agregar Invernadero

        #region Listar Invernaderos

        /// <summary>
        /// Método que accede a la base de datos para
        /// seleccionar todas los invrnaderos y los 
        /// agrega en una lista.
        /// </summary>
        /// <returns></returns>
        public List<Entidad> ListarInvernaderos(Entidad _invernadero)
        {
            _lInvernadero = new List<Entidad>();

            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELInvernaderos]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@IdPersona",
                (_invernadero as Invernadero).Persona.Id);

                SqlDataReader readers = command.ExecuteReader();

                while (readers.Read())
                {
                    _miInvernadero= FabricaEntidad.NuevoInvernadero();

                    (_miInvernadero as Invernadero).Id = readers.GetInt32(0);
                    (_miInvernadero as Invernadero).Nombre = readers.GetString(1);
                    (_miInvernadero as Invernadero).Descripcion = readers.GetString(2);

                    _lInvernadero.Add(_miInvernadero);
                }
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            finally
            {
                bd.CerrarConexion();
            }

            if (_lInvernadero.Count == 0)
            {
                return null;
            }
            else

                return _lInvernadero;
        }

        #endregion Listar Invernaderos

        #region Agergar Valores de Variables

        /// <summary>
        /// Método que accede a la base de datos para
        /// agregar los valores de las varibales de un invernadero.
        /// </summary>
        /// <param name="_invernadero"></param>
        /// <returns></returns>
        public bool AgregarValoresVariables(Entidad _invernadero)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[INSVariables]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Nombre",
                (_invernadero as Invernadero).Nombre);
                command.Parameters.AddWithValue("@Fecha",
                DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"));
                command.Parameters.AddWithValue("@Valor",
                (_invernadero as Invernadero).Descripcion);

                SqlDataReader readers = command.ExecuteReader();

                readers.Close();
                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            catch (Exception)
            {
                return false;
            }
            finally
            {
                bd.CerrarConexion();
            }
        }

        #endregion Agregar Valores de Variables

        #region Consultar Variables Actual

        /// <summary>
        /// Método que accede a la base de datos para
        /// seleccionar todas las variables de un invernadero 
        /// especifico y las agrega en una lista.
        /// </summary>
        /// <returns></returns>
        public Entidad ConsultarVariable(Entidad _invernadero)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELVariables]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@IdInvernadero",
                (_invernadero as Invernadero).Id);
                string fecha = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
                command.Parameters.AddWithValue("@Fecha",
                fecha);
                                
                SqlDataReader readers = command.ExecuteReader();
                _miInvernadero = FabricaEntidad.NuevoInvernadero();
                (_miInvernadero as Invernadero).Acides = (Acides)FabricaEntidad.NuevaAcidez();
                (_miInvernadero as Invernadero).Humedad = (Humedad)FabricaEntidad.NuevaHumedad();
                (_miInvernadero as Invernadero).Luminosidad = (Luminosidad)FabricaEntidad.NuevaLuminosidad();
                (_miInvernadero as Invernadero).Temperatura = (Temperatura)FabricaEntidad.NuevaTemperatura();

                while (readers.Read())
                {
                    _nombre = readers.GetString(0);
                    
                    if (_nombre == "Acidez")
                    {
                        (_miInvernadero as Invernadero).Acides.Nombre = readers.GetString(0);
                        (_miInvernadero as Invernadero).Acides.Medicion = Convert.ToString(readers.GetInt32(1));
                    }
                    if (_nombre == "Humedad")
                    {
                        (_miInvernadero as Invernadero).Humedad.Nombre = readers.GetString(0);
                        (_miInvernadero as Invernadero).Humedad.Medicion = Convert.ToString(readers.GetInt32(1));
                    }
                    if(_nombre == "Luminosidad")
                    {
                        (_miInvernadero as Invernadero).Luminosidad.Nombre = readers.GetString(0);
                        (_miInvernadero as Invernadero).Luminosidad.Medicion = Convert.ToString(readers.GetInt32(1));
                    }
                    if (_nombre == "Temperatura")
                    {
                        (_miInvernadero as Invernadero).Temperatura.Nombre = readers.GetString(0);
                        (_miInvernadero as Invernadero).Temperatura.Medicion = Convert.ToString(readers.GetInt32(1));
                    }
                }
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            finally
            {
                bd.CerrarConexion();
            }

            if (_miInvernadero == null)
            {
                return null;
            }
            else
                return _miInvernadero;
        }

        #endregion Consultar Variables Actual

        #region Consultar Variables Diario

        /// <summary>
        /// Método que accede a la base de datos para
        /// seleccionar el promedio de las variables.
        /// </summary>
        /// <returns></returns>
        public int ConsultarVariablesD(Entidad _invernadero)
        {
            _lInvernadero = new List<Entidad>();
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELVariablesD]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@IdInvernadero",
                (_invernadero as Invernadero).Id);
                command.Parameters.AddWithValue("@Nombre",
                (_invernadero as Invernadero).Nombre);
                string fe = DateTime.Today.ToString("dd/MM/yyyy");
                command.Parameters.AddWithValue("@Fecha",
                fe);

                SqlDataReader readers = command.ExecuteReader();
                readers.Read();
                promedioV = readers.GetInt32(0);
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            finally
            {
                bd.CerrarConexion();
            }
            return promedioV;
        }

        #endregion Consultar Variables Diario

        #region Consultar Variables Actual

        /// <summary>
        /// Método que accede a la base de datos para
        /// seleccionar todas las variables de un invernadero 
        /// especifico y las agrega en una lista.
        /// </summary>
        /// <returns></returns>
        public Entidad ConsultarVariableM(Entidad _invernadero)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[SELVariablesM]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@IdInvernadero",
                (_invernadero as Invernadero).Id);
                string fecha = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss");
                command.Parameters.AddWithValue("@Fecha",
                fecha);

                SqlDataReader readers = command.ExecuteReader();
                _miInvernadero = FabricaEntidad.NuevoInvernadero();
                (_miInvernadero as Invernadero).TanqueAgua = 
                    (TanqueAgua)FabricaEntidad.NuevoTanqueAgua();
                (_miInvernadero as Invernadero).TanqueLiquidoEspecial = 
                    (TanqueLiquidoEspecial)FabricaEntidad.NuevoTanqueLiquidoEspecial();

                while (readers.Read())
                {
                    _nombre = readers.GetString(2);

                    if (_nombre == "Tanque Agua")
                    {
                        (_miInvernadero as Invernadero).TanqueAgua.Cantidad =
                            readers.GetString(1);
                    }
                    if (_nombre == "Tanque Liquido Especial")
                    {
                        (_miInvernadero as Invernadero).TanqueLiquidoEspecial.Cantidad =
                            readers.GetString(1);
                    }
                }
            }
            catch (SqlException)
            {
                throw new Exception("Error en la conexion con la base de datos");
            }
            finally
            {
                bd.CerrarConexion();
            }

            if (_miInvernadero == null)
            {
                return null;
            }
            else
                return _miInvernadero;
        }

        #endregion Consultar Variables Actual

        #region Modificar Invernadero

        public bool ModificarInvernadero(Entidad _invernadero)
        {
            try
            {
                bd.AbrirConexion();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[UDPInvernadero]";
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@Id",
                    (_invernadero as Invernadero).Id);
                command.Parameters.AddWithValue("@Nombre",
                    (_invernadero as Invernadero).Nombre);
                command.Parameters.AddWithValue("@Descripcion",
                    (_invernadero as Invernadero).Descripcion);

                command.ExecuteReader();

                return true;
            }
            catch (SqlException)
            {
                return false;
            }
            finally
            {
                bd.CerrarConexion();
            }
        }

        #endregion Modificar Invernadero

        #endregion Métodos
    }
}